import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Notification, MessageBox, Message, Loading } from 'element-ui'
import { getToken } from "@/libs/auth";
import { baseApi } from '@/config'


// 创建Axios实例
const axiosInstance = axios.create({
    baseURL: baseApi, // API的base_url+加前缀
    timeout: 80000, // 请求超时时间
    withCredentials: true // 跨域请求，允许保存cookie
})

// request拦截器
axiosInstance.interceptors.request.use(config => {
    // 发送请求前
    if(getToken()) {
        // 设置默认携带的头信息(Token)
        config.headers['token'] = getToken()
    }
    return config
}, error => {
    // 请求错误
    return Promise.reject(error);
})


//防止重复弹出“重新登陆”对话框
let flag = false

// response拦截器
axiosInstance.interceptors.response.use(
    response => {
        // 响应结果返回到页面前可以对数据进行处理，自定义code来标示请求状态，当code返回如下情况为权限有问题，登出并返回到登录页
        let data = response.data

        if(response.headers.filename) {
            // 请求的是文件下载，response会返回filename，将filename加入到返回结果中
            data = Object.assign(data, {filename: decodeURI(response.headers.filename)})
        }

        if(!data.status) {

            // 登录超时或未登录
            if(data.code == 401 && !flag) {
                flag = true
                MessageBox.alert(data.msg, '警告', {
                    confirmButtonText: '重新登陆',
                    callback: () => {
                        // 删除登录状态，清空session缓存
                        store.dispatch('FedLogOut')
                        Loading.service({
                            lock: true,
                            text: '正在退出，请稍等...',
                            background: 'rgba(0, 0, 0, 0.7)'
                        });
                        setTimeout(() => {
                            window.location.reload()
                        }, 500)
                    }
                })
            }

        }

        return data
    },
    error => {
        // 请求已发出，但服务器响应的状态码不在 2xx 范围内
        console.log('error', error)

        return Promise.reject(error)
    }
)

function Msg(type, message) {
    Message({
        type: type,
        duration: 2000,
        message: message
    })
}

function NotificationMsg(type, title, message) {
    Notification({
        type: type,
        duration: 2000,
        title: title,
        message: message
    })
}

function ExceptionMsg(type, title, message) {
    MessageBox({
        type: type,
        title: title,
        message: message,
        customClass: 'errorMessageBox'
    })
}

export default axiosInstance;
